/**
 * 
 */
package com.xpec.c4.game.utility;

import java.util.AbstractCollection;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 用輪詢的方式取得列表中的物件
 * 
 * @author TW15010
 */
public class RoundRobinSelector<T> {
	/**
	 * 使用同步鎖時參考的物件
	 */
	private Object lockObj = new Object();

	/**
	 * 取資料用的物件列表
	 */
	private ArrayList<T> objList = null;

	/**
	 * 物件總數
	 */
	private int maxSize;

	/**
	 * thread safe int 累加計數器
	 */
	private AtomicInteger aiIndex = new AtomicInteger(0);

	/**
	 * 設定要用來取資料的物件列表
	 * 
	 * @param objList
	 */
	public void setSelectObjectList(AbstractCollection<T> objList) {
		if (objList == null) {
			return;
		}

		ArrayList<T> tmpObjList = new ArrayList<T>();
		tmpObjList.addAll(objList);

		synchronized (lockObj) {
			this.objList = tmpObjList;
			maxSize = tmpObjList.size();
			aiIndex.set(GameUtility.randomInt(0, 1000));
		}
	}

	/**
	 * 取得下一個物件
	 * 
	 * @return
	 */
	public T getNext() {
		ArrayList<T> tmpObjList = null;
		synchronized (lockObj) {
			tmpObjList = objList;
		}

		if (GameUtility.getArrayListSize(tmpObjList) == 0) {
			return null;
		}

		int idx = aiIndex.incrementAndGet();
		idx = idx % maxSize;

		return tmpObjList.get(idx);
	}
}
